# -*- coding: utf-8 -*-

 ###############################################
 ##                                             ##
 ##  Model (Persons)                             ##
 ##                                              ##
 ##                                              ##
 ##  for Basiq Series                            ##
 ##  by Críptidos Digitales                      ##
 ##  GPL (c)2008                                 ##
  ##                                             ##
    ###############################################

import datetime


from mainModel import *

from baseModel import *



def activePriceRules():
    data = getAttributes(grupo='rangoPrecioProducto', order='referencia')
    active = []
    for rule in data:
        if rule['referencia'][1] == 'a':
            active.append(rule)
    return active


def addPerson(**data):
    """ Formats data in a dict that Model requires
    """

    person = {}

    if 'id' in data.keys():         person['id'] = data['id']
    if 'personalidad' in data.keys(): person['personality'] = data['personalidad']
    if 'nombre' in data.keys():     person['name'] = data['nombre']
    if 'nombre2' in data.keys():    person['name2'] = data['nombre2']
    if 'alias' in data.keys():      person['alias'] = data['alias']
    if 'fechanacimiento' in data.keys(): person['birthdate'] = data['fechanacimiento']
    if 'rfc' in data.keys():        person['rfc'] = data['rfc']
    if 'curp' in data.keys():       person['curp'] = data['curp']

    rol = {}

    # if 'id' in data.keys():         self.id = data.pop('id')
    # if 'code' in data.keys():       self.code = data.pop('code')
    if 'entidad_id' in data.keys(): rol['person_id'] = data.pop('entidad_id')
    if 'tipo_id' in data.keys():    rol['type_id'] = data.pop('tipo_id')
    elif 'tipo' in data.keys():
        rol['type_id'] = getAttribute(grupo='tipoRol', nombre=data.pop('tipo'))['id']
    if 'funcion' in data.keys():    rol['function'] = data.pop('funcion')
    if 'comentarios' in data.keys(): rol['comment'] = data.pop('comentarios')
    if 'dato1' in data.keys():      rol['data1'] = data.pop('dato1')
    if 'dato2' in data.keys():      rol['data2'] = data.pop('dato2')

    address = {}

    if 'rol_id' in data.keys():     address['rol_id'] = data['rol_id']
    if 'tipo' in data.keys():       address['tipo'] = data.pop('tipo')
    else:                           address['tipo'] = u"personal"
    if 'calle' in data.keys():      address['street'] = data.pop('calle')
    if 'areanominal' in data.keys(): address['nominalarea'] = data.pop('areanominal')
    if 'areapostal' in data.keys(): address['zipcode'] = data.pop('areapostal')
    if 'areatelefonica' in data.keys(): address['phonearea'] = data.pop('areatelefonia')
    else:   self.areatelefonica = u""
    if 'lugar_id' in data.keys():   address['place_id'] = data.pop('lugar_id')
    elif 'place' in data.keys():
        address['place_id'] = getAttribute(grupo='lugar', nombre=data.pop('lugar'))['id']

    contact = {}

    if 'contactos' in data.keys():
        if 'rol_id' in data.keys():     contact['rol_id'] = data['rol_id']
        contact['nombre'] = data['contactos'][0]
        contact['valor'] = data['contactos'][1]

    functions = []

    if 'funciones' in data.keys():
        for funcion in data['funciones']:
            function = {}
            if rol_id in data.keys():   function['rol_id'] = data['rol_id']
            function['nombre'] = funcion[0]
            function['valor'] = funcion[1]
            functions.append(function)

    if rol:
        if address:
            rol['addresses'] = [address]
        if contact:
            rol['contacts'] = [contact]
        if functions:
            rol['functions'] = [functions]

        person['rols'] = [rol]

    return Person(person)



def addresses(**filters):
    data = getAll('addressV', rol_id=filters['rol_id'])
    return data


def defaultPriceRule():
    registro = getAttribute(grupo=u'rangoPrecioProducto', valor=u'default')
    return registro


def defautlRol(tipo):
    defaultRol_id = int(getAttribute(grupo=tipo, nombre=u'default')['valor'])
    data = rol(id=defaultRol_id)
    return data




# def personality(**filters):
    # personality = attribute(grupo=u'personalidadEntidad', **filters)
    # return personality


def rolesLike(**filters):
    #! Parece que tipo solo busca por cliente

    command = """SELECT * FROM roles JOIN entidades ON (roles.entidad_id=entidades.id) """

    orderText = ""
    if 'order' in filters.keys():
        orderText = filters.pop('order')

    filtersText = ""
    if 'tipo' in filters.keys():
        filters['tipo_id'] = getAttribute(grupo=u'tipoRol', nombre=filters.pop('tipo'))['id']

    for filter in filters.keys():
        if type(filters[filter]) in (str, unicode, datetime.datetime):
            filtersText += "%s LIKE'%s%%' AND " % (filter, filters[filter])
        else:
            filtersText += "%s=%s AND " % (filter, filters[filter])

    if filtersText:
        command += "WHERE %s " % filtersText.rstrip("AND ")
    if orderText:
        command += "ORDER BY %s" % orderText

    print '------- rolesLike', command

    query(command)
    roles = fetchall()

    return roles












#~ def rolDefault(tipo):
    #~ rolDefault_id = int(atributoI(grupo=tipo, nombre=u'default').valor)
    #~ registro = rolI(id=rolDefault_id)
    #~ return registro


# def rolDefault(tipo):
    # f=g
    # rolDefault_id = int(atributo(grupo=tipo, nombre=u'default')['valor'])
    # data = rol(id=rolDefault_id)
    # return data



def damePersonalidad(**filtros):
    f=g
    #! obsoleto, use personalidadI()
    filtros['grupo'] = u'entidades'
    filtros['nombre'] = u'personalidad'
    registro = atributoI(**filtros)
    # registro = man.session().query(Atributo).filter_by(**filtros).one()
    return registro


def damePuestos(**filtros):
    f=g
    registros = atributosI(grupo=u"tipoEmpleado")
    return registros



def dameUno(*args, **filtros):
    f=g
    #! obsoleto, use rolI()
    if filtros.has_key('id'):
        rol = man.session().query(Rol).filter(Rol.id==filtros['id']).one()
    elif 'rfc' in filtros.keys():
        rol = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.rfc==unicode(filtros['rfc'])).first()
    else:
        rol = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter_by(**filtros).first()
    return rol


def dameVarios(*args, **filtros):   # print "personas.modelo.dameVarios()"
    f=g
    #! obsoleto, use rolesI()

    if 'rfc' in filtros.keys():
        roles = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.rfc==filtros['rfc']).all()
    elif filtros.has_key('nombre2'):
        roles = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.nombre2==filtros['nombre2']).all()
    elif filtros.has_key('order'):
        if filtros['order'] == 'nombre':
            roles = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.nombre!=u'').order_by(Entidad.nombre).order_by(Entidad.nombre2).all()
        if filtros['order'] == 'nombre2':
            roles = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.nombre2!=u'').order_by(Entidad.nombre2).order_by(Entidad.nombre).all()
    else:
        roles = man.session().query(Rol).filter(Rol.tipo==args[0]).all()
    return roles


def elimina(**filtros):
    registro = man.session().query(Rol).filter(Rol.id==filtros['id']).one()
    man.session().delete(registro)
    man.session().commit()


def modifica(datos):                # print "personas.modelo.modifica()"
    f=g
    #! obsoleto, use rolI()

    rol = man.session().query(Rol).filter(Rol.id==datos['id']).one()
    if 'comentarios' in datos.keys():
        rol.comentarios = datos['comentarios']
    rol.entidad.nombre = datos['nombre']
    rol.entidad.nombre2 = datos['nombre2']
    rol.entidad.personalidad = datos['personalidad']
    rol.entidad.rfc = datos['rfc']

    if rol.contactos:
        rol.contactos[0].valor = datos['telefono']
    else:
        contacto = {
            'rol_id': rol.id,
            'tipo': u'Tel fijo',
            'valor': datos['telefono']}
        contacto = Contacto(**contacto)
        man.session().add(contacto)
        if rol.contactos:
            rol.contactos.append(contacto)
        else:
            rol.contactos = [contacto]

    funcionesOld = [x for x in rol.atributos if x.nombre==u'función']


    for item in datos['funciones']:
        if item[0]:
            funcion = [x for x in funcionesOld if x.id == item[0]][0]
            funcion.valor = item[1]
        else:
            funcion = AtributoRol(rol_id=rol.id, nombre=u'función', valor=item[1])
            rol.atributos.append(funcion)
            man.session().add(funcion)

    # if rol.funciones:
        # if funciones:
            # for funcion in rol.funciones:
                # print 2345, funcion
                # if funcion in

    if datos['lugar'][1] == -1 and datos['lugar'][0]:
        lugar = Atributo(grupo=u'lugar', nombre=datos['lugar'][0])
        man.session().add(lugar)
        man.session().flush()
        datos['lugar'][1] = lugar.id

    if rol.direcciones:
        rol.direcciones[0].lugar_id = datos['lugar'][1]
        rol.direcciones[0].areapostal = datos['areapostal']
        rol.direcciones[0].areanominal = datos['areanominal']
        rol.direcciones[0].calle = datos['calle']
    else:
        if datos['lugar'] and datos['areapostal'] and datos['areanominal'] and datos['calle']:
            direccion = Direccion(lugar_id=datos['lugar'][1], areapostal = datos['areapostal'], areanominal = datos['areanominal'], calle = datos['calle'])
            man.session().add(direccion)
            rol.direcciones = [direccion]

    rol.dato2 = datos['dato2']

    man.session().update(rol)
    man.session().commit()
    return rol.id





def initDb():
    # print "personas.model.initDb(",
    try:
        version = int(getAttribute(grupo=u'entidad', nombre=u'versionBasedatos')['valor'])
    except:
        print "Inicializando Base de datos para entidades"
        registros = [
            {'code':1405, 'grupo':u'personalidadEntidad', 'nombre':u'Física', 'referencia':u'1'},
            {'code':1407, 'grupo':u'personalidadEntidad', 'nombre':u'Moral', 'referencia':u'0'},

            {'code':1421, 'grupo':u'tipoRol', 'nombre':u'propio'},
            {'code':1423, 'grupo':u'tipoRol', 'nombre':u'empleado'},
            {'code':1425, 'grupo':u'tipoRol', 'nombre':u'banco'},
            {'code':1427, 'grupo':u'tipoRol', 'nombre':u'proveedor'},
            {'code':1428, 'grupo':u'tipoRol', 'nombre':u'proveedor2'},
            {'code':1429, 'grupo':u'tipoRol', 'nombre':u'cliente'},

            {'code':1431, 'grupo':u'tipoEmpleado', 'nombre':u'técnico'},
            {'code':1433, 'grupo':u'tipoEmpleado', 'nombre':u'vendedor'},
            {'code':1435, 'grupo':u'tipoEmpleado', 'nombre':u'administrador'},

            {'code':1451, 'grupo':u'tipoContacto', 'nombre':u'tel fijo'},
            {'code':1453, 'grupo':u'tipoContacto', 'nombre':u'tel móvil'},
            {'code':1455, 'grupo':u'tipoContacto', 'nombre':u'email'}
            ]
        # id=1441, grupo=u'cliente', nombre=u'default', valor=

        for registro in registros:
            #~ atributoII(**registro)
            setAttribute(**registro)

        ## Instituciones Bancarias
        lista = [
        [3, u'Banamex', u'Banco Nacional de México, S.A.', u'', u'BAN111111222', u'Isabel la Católica 44', u'Col. Centro Histórico, Del. Cuauhtémoc', u'México, D.F.', u'06000'],
        [7, u'Banco Santander', u'Banco Santander, S.A.', u'', u'SAN111111333', u'Prol. Paseo de la Reforma No. 500, Piso 4; Mód.401', u'Col. Lomas de Santa Fe', u'México, D.F.', u'01219'],
        [11, u'BBVA Bancomer', u'BBVA Bancomer, S.A.', u'', u'BBV111111222', u'Av. Universidad No. 1200, 2º Piso', u'Col. Xoco', u'México, D.F.', u'03339'],
        [15, u'HSBC', u'HSBC México, S.A.', u'', u'HSB111111222', u'Paseo de la Reforma No. 347', u'Col. Juárez', u'México, D.F.', u'06600'],
        [19, u'ScotiaBank', u'Scotiabank, S.A.', u'', u'SCO111111222', u'Blvd. Manuel Ávila Camacho No. 1 Piso 19', u'Col. Lomas de Chapultepec', u'México, D.F.', u'11009'],
        ]

        for item in lista:
            datos = {}
            datos['code'] = item[0]
            datos['tipo'] = u'banco'

            datos['personalidad'] = int(getAttribute(grupo='personalidadEntidad', nombre=u'Moral')['referencia'])
            datos['nombre'] = item[2]
            datos['nombre2'] = item[3]
            datos['rfc'] = item[4]
            datos['fechanacimiento'] = datetime.date(1900,1,1)

            datos['lugar'] = item[7]
            datos['areapostal'] = item[8]
            datos['areanominal'] = item[6]
            datos['calle'] = item[5]

            datos['alias'] = item[1]

            rolI(**datos)

        ## CLIENTES
        datos = {}
        datos['code'] = 3
        datos['tipo'] = u'cliente'

        datos['personalidad'] = int(getAttribute(grupo=u'personalidadEntidad', nombre=u'Física')['referencia'])
        datos['nombre'] = u'Público'
        datos['nombre2'] = u'general'
        datos['rfc'] = u'XXXX010101XXX'
        datos['fechanacimiento'] = datetime.date(1900,1,1)

        datos['lugar'] = u'Los Mochis, Sin.'
        datos['areapostal'] = u'81200'
        datos['areanominal'] = u'Col. Centro'
        datos['calle'] = u'Domicilio conocido'

        datos['telefonoFijo'] = u''

        rol_ = rolI(**datos)

        setAttribute(code=1441, grupo=u'cliente', nombre=u'default', valor=u"%s" % rol_.id)

        setAttribute(grupo=u'entidad', nombre=u'versionBasedatos', valor=u'1')
        version = 1


    # print ")"


